/*****************************************************************************
 *   Copyright(C)2009-2022 by VSF Team                                       *
 *                                                                           *
 *  Licensed under the Apache License, Version 2.0 (the "License");          *
 *  you may not use this file except in compliance with the License.         *
 *  You may obtain a copy of the License at                                  *
 *                                                                           *
 *     http://www.apache.org/licenses/LICENSE-2.0                            *
 *                                                                           *
 *  Unless required by applicable law or agreed to in writing, software      *
 *  distributed under the License is distributed on an "AS IS" BASIS,        *
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
 *  See the License for the specific language governing permissions and      *
 *  limitations under the License.                                           *
 *                                                                           *
 ****************************************************************************/

#ifndef __VSF_SDL2_KEYCODE_H__
#define __VSF_SDL2_KEYCODE_H__

/*============================ INCLUDES ======================================*/

// for keyboard in input
#include "component/vsf_component.h"

#ifdef __cplusplus
extern "C" {
#endif

/*============================ MACROS ========================================*/

#define SDLK_SCANCODE_MASK              (1 << 30)
#define SDL_SCANCODE_TO_KEYCODE(__X)    ((__X) | SDLK_SCANCODE_MASK)

/*============================ MACROFIED FUNCTIONS ===========================*/
/*============================ TYPES =========================================*/

typedef enum {
    SDL_SCANCODE_UNKNOWN        = 0,

    SDL_SCANCODE_A              = VSF_KB_a,
    SDL_SCANCODE_B              = VSF_KB_b,
    SDL_SCANCODE_C              = VSF_KB_c,
    SDL_SCANCODE_D              = VSF_KB_d,
    SDL_SCANCODE_E              = VSF_KB_e,
    SDL_SCANCODE_F              = VSF_KB_f,
    SDL_SCANCODE_G              = VSF_KB_g,
    SDL_SCANCODE_H              = VSF_KB_h,
    SDL_SCANCODE_I              = VSF_KB_i,
    SDL_SCANCODE_J              = VSF_KB_j,
    SDL_SCANCODE_K              = VSF_KB_k,
    SDL_SCANCODE_L              = VSF_KB_l,
    SDL_SCANCODE_M              = VSF_KB_m,
    SDL_SCANCODE_N              = VSF_KB_n,
    SDL_SCANCODE_O              = VSF_KB_o,
    SDL_SCANCODE_P              = VSF_KB_p,
    SDL_SCANCODE_Q              = VSF_KB_q,
    SDL_SCANCODE_R              = VSF_KB_r,
    SDL_SCANCODE_S              = VSF_KB_s,
    SDL_SCANCODE_T              = VSF_KB_t,
    SDL_SCANCODE_U              = VSF_KB_u,
    SDL_SCANCODE_V              = VSF_KB_v,
    SDL_SCANCODE_W              = VSF_KB_w,
    SDL_SCANCODE_X              = VSF_KB_x,
    SDL_SCANCODE_Y              = VSF_KB_y,
    SDL_SCANCODE_Z              = VSF_KB_z,

    SDL_SCANCODE_1              = VSF_KB_1,
    SDL_SCANCODE_2              = VSF_KB_2,
    SDL_SCANCODE_3              = VSF_KB_3,
    SDL_SCANCODE_4              = VSF_KB_4,
    SDL_SCANCODE_5              = VSF_KB_5,
    SDL_SCANCODE_6              = VSF_KB_6,
    SDL_SCANCODE_7              = VSF_KB_7,
    SDL_SCANCODE_8              = VSF_KB_8,
    SDL_SCANCODE_9              = VSF_KB_9,
    SDL_SCANCODE_0              = VSF_KB_0,

    SDL_SCANCODE_RETURN         = VSF_KB_ENTER,
    SDL_SCANCODE_ESCAPE         = VSF_KB_ESCAPE,
    SDL_SCANCODE_BACKSPACE      = VSF_KB_BACKSPACE,
    SDL_SCANCODE_TAB            = VSF_KB_TAB,
    SDL_SCANCODE_SPACE          = VSF_KB_SPACE,

    SDL_SCANCODE_MINUS          = VSF_KB_MINUS,
    SDL_SCANCODE_EQUALS         = VSF_KB_EQUAL,
    SDL_SCANCODE_LEFTBRACKET    = VSF_KB_LEFT_BRACKET,
    SDL_SCANCODE_RIGHTBRACKET   = VSF_KB_RIGHT_BRACKET,
    SDL_SCANCODE_BACKSLASH      = VSF_KB_BACKSLASH,
    SDL_SCANCODE_SEMICOLON      = VSF_KB_SEMICOLON,
    SDL_SCANCODE_APOSTROPHE     = VSF_KB_SINGLE_QUOTE,
    SDL_SCANCODE_GRAVE          = VSF_KB_GRAVE,
    SDL_SCANCODE_COMMA          = VSF_KB_COMMA,
    SDL_SCANCODE_PERIOD         = VSF_KB_DOT,
    SDL_SCANCODE_SLASH          = VSF_KB_SLASH,
    SDL_SCANCODE_CAPSLOCK       = VSF_KB_CAPSLOCK,

    SDL_SCANCODE_F1             = VSF_KB_F1,
    SDL_SCANCODE_F2             = VSF_KB_F2,
    SDL_SCANCODE_F3             = VSF_KB_F3,
    SDL_SCANCODE_F4             = VSF_KB_F4,
    SDL_SCANCODE_F5             = VSF_KB_F5,
    SDL_SCANCODE_F6             = VSF_KB_F6,
    SDL_SCANCODE_F7             = VSF_KB_F7,
    SDL_SCANCODE_F8             = VSF_KB_F8,
    SDL_SCANCODE_F9             = VSF_KB_F9,
    SDL_SCANCODE_F10            = VSF_KB_F10,
    SDL_SCANCODE_F11            = VSF_KB_F11,
    SDL_SCANCODE_F12            = VSF_KB_F12,

    SDL_SCANCODE_PRINTSCREEN    = VSF_KB_PRINT_SCREEN,
    SDL_SCANCODE_SCROLLLOCK     = VSF_KB_SCROLL_LOCK,
    SDL_SCANCODE_PAUSE          = VSF_KB_PAUSE,
    SDL_SCANCODE_INSERT         = VSF_KB_INSERT,
    SDL_SCANCODE_HOME           = VSF_KB_HOME,
    SDL_SCANCODE_PAGEUP         = VSF_KB_PAGE_UP,
    SDL_SCANCODE_DELETE         = VSF_KB_DELETE,
    SDL_SCANCODE_END            = VSF_KB_END,
    SDL_SCANCODE_PAGEDOWN       = VSF_KB_PAGE_DOWN,
    SDL_SCANCODE_RIGHT          = VSF_KB_RIGHT,
    SDL_SCANCODE_LEFT           = VSF_KB_LEFT,
    SDL_SCANCODE_DOWN           = VSF_KB_DOWN,
    SDL_SCANCODE_UP             = VSF_KB_UP,
    SDL_SCANCODE_NUMLOCKCLEAR   = VSF_KP_NUMLOCK,

    SDL_SCANCODE_KP_DIVIDE      = VSF_KP_DIVIDE,
    SDL_SCANCODE_KP_MULTIPLY    = VSF_KP_MULTIPLY,
    SDL_SCANCODE_KP_MINUS       = VSF_KP_MINUS,
    SDL_SCANCODE_KP_PLUS        = VSF_KP_PLUS,
    SDL_SCANCODE_KP_ENTER       = VSF_KP_ENTER,
    SDL_SCANCODE_KP_1           = VSF_KP_1,
    SDL_SCANCODE_KP_2           = VSF_KP_2,
    SDL_SCANCODE_KP_3           = VSF_KP_3,
    SDL_SCANCODE_KP_4           = VSF_KP_4,
    SDL_SCANCODE_KP_5           = VSF_KP_5,
    SDL_SCANCODE_KP_6           = VSF_KP_6,
    SDL_SCANCODE_KP_7           = VSF_KP_7,
    SDL_SCANCODE_KP_8           = VSF_KP_8,
    SDL_SCANCODE_KP_9           = VSF_KP_9,
    SDL_SCANCODE_KP_0           = VSF_KP_0,
    SDL_SCANCODE_KP_PERIOD      = VSF_KP_DOT,
    SDL_SCANCODE_APPLICATION    = VSF_KB_APPLICATION,
    SDL_SCANCODE_POWER          = VSF_KB_POWER,
    SDL_SCANCODE_KP_EQUALS      = VSF_KP_EQUAL,

    SDL_SCANCODE_F13            = VSF_KB_F13,
    SDL_SCANCODE_F14            = VSF_KB_F14,
    SDL_SCANCODE_F15            = VSF_KB_F15,
    SDL_SCANCODE_F16            = VSF_KB_F16,
    SDL_SCANCODE_F17            = VSF_KB_F17,
    SDL_SCANCODE_F18            = VSF_KB_F18,
    SDL_SCANCODE_F19            = VSF_KB_F19,
    SDL_SCANCODE_F20            = VSF_KB_F20,
    SDL_SCANCODE_F21            = VSF_KB_F21,
    SDL_SCANCODE_F22            = VSF_KB_F22,
    SDL_SCANCODE_F23            = VSF_KB_F23,
    SDL_SCANCODE_F24            = VSF_KB_F24,

    SDL_SCANCODE_EXECUTE        = VSF_KB_EXECUTE,
    SDL_SCANCODE_HELP           = VSF_KB_HELP,
    SDL_SCANCODE_MENU           = VSF_KB_MENU,
    SDL_SCANCODE_SELECT         = VSF_KB_SELECT,
    SDL_SCANCODE_STOP           = VSF_KB_STOP,
    SDL_SCANCODE_AGAIN          = VSF_KB_AGAIN,
    SDL_SCANCODE_UNDO           = VSF_KB_UNDO,
    SDL_SCANCODE_CUT            = VSF_KB_CUT,
    SDL_SCANCODE_COPY           = VSF_KB_COPY,
    SDL_SCANCODE_PASTE          = VSF_KB_PASTE,
    SDL_SCANCODE_FIND           = VSF_KB_FIND,
    SDL_SCANCODE_MUTE           = VSF_KB_MUTE,
    SDL_SCANCODE_VOLUMEUP       = VSF_KB_VOLUMEUP,
    SDL_SCANCODE_VOLUMEDOWN     = VSF_KB_VOLUMEDOWN,
    SDL_SCANCODE_KP_COMMA       = VSF_KP_COMMA,

    SDL_SCANCODE_LCTRL          = VSF_KB_LCTRL,
    SDL_SCANCODE_LSHIFT         = VSF_KB_LSHIFT,
    SDL_SCANCODE_LALT           = VSF_KB_LALT,
    SDL_SCANCODE_LGUI           = VSF_KB_LGUI,
    SDL_SCANCODE_RCTRL          = VSF_KB_RCTRL,
    SDL_SCANCODE_RSHIFT         = VSF_KB_RSHIFT,
    SDL_SCANCODE_RALT           = VSF_KB_RALT,
    SDL_SCANCODE_RGUI           = VSF_KB_RGUI,
    SDL_SCANCODE_MODE           = VSF_KB_MODE,

    SDL_NUM_SCANCODES           = 512,
} SDL_Scancode;

typedef int32_t SDL_Keycode;
enum {
    SDLK_UNKNOWN                = 0,

    SDLK_BACKSPACE              = '\b',
    SDLK_RETURN                 = '\r',
    SDLK_ESCAPE                 = '\033',
    SDLK_TAB                    = '\t',
    SDLK_SPACE                  = ' ',
    SDLK_EXCLAIM                = '!',
    SDLK_QUOTEDBL               = '"',
    SDLK_HASH                   = '#',
    SDLK_PERCENT                = '%',
    SDLK_DOLLAR                 = '$',
    SDLK_AMPERSAND              = '&',
    SDLK_QUOTE                  = '\'',
    SDLK_LEFTPAREN              = '(',
    SDLK_RIGHTPAREN             = ')',
    SDLK_ASTERISK               = '*',
    SDLK_PLUS                   = '+',
    SDLK_COMMA                  = ',',
    SDLK_MINUS                  = '-',
    SDLK_PERIOD                 = '.',
    SDLK_SLASH                  = '/',

    SDLK_0                      = '0',
    SDLK_1                      = '1',
    SDLK_2                      = '2',
    SDLK_3                      = '3',
    SDLK_4                      = '4',
    SDLK_5                      = '5',
    SDLK_6                      = '6',
    SDLK_7                      = '7',
    SDLK_8                      = '8',
    SDLK_9                      = '9',

    SDLK_COLON                  = ':',
    SDLK_SEMICOLON              = ';',
    SDLK_LESS                   = '<',
    SDLK_EQUALS                 = '=',
    SDLK_GREATER                = '>',
    SDLK_QUESTION               = '?',
    SDLK_AT                     = '@',
    SDLK_LEFTBRACKET            = '[',
    SDLK_BACKSLASH              = '\\',
    SDLK_RIGHTBRACKET           = ']',
    SDLK_CARET                  = '^',
    SDLK_UNDERSCORE             = '_',
    SDLK_BACKQUOTE              = '`',
    SDLK_LEFTBRACE              = '{',
    SDLK_RIGHTBRACE             = '}',

    SDLK_a                      = 'a',
    SDLK_b                      = 'b',
    SDLK_c                      = 'c',
    SDLK_d                      = 'd',
    SDLK_e                      = 'e',
    SDLK_f                      = 'f',
    SDLK_g                      = 'g',
    SDLK_h                      = 'h',
    SDLK_i                      = 'i',
    SDLK_j                      = 'j',
    SDLK_k                      = 'k',
    SDLK_l                      = 'l',
    SDLK_m                      = 'm',
    SDLK_n                      = 'n',
    SDLK_o                      = 'o',
    SDLK_p                      = 'p',
    SDLK_q                      = 'q',
    SDLK_r                      = 'r',
    SDLK_s                      = 's',
    SDLK_t                      = 't',
    SDLK_u                      = 'u',
    SDLK_v                      = 'v',
    SDLK_w                      = 'w',
    SDLK_x                      = 'x',
    SDLK_y                      = 'y',
    SDLK_z                      = 'z',

    SDLK_KP_0                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_0),
    SDLK_KP_1                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_1),
    SDLK_KP_2                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_2),
    SDLK_KP_3                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_3),
    SDLK_KP_4                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_4),
    SDLK_KP_5                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_5),
    SDLK_KP_6                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_6),
    SDLK_KP_7                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_7),
    SDLK_KP_8                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_8),
    SDLK_KP_9                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_0),
    SDLK_KP0                    = SDLK_KP_0,
    SDLK_KP1                    = SDLK_KP_1,
    SDLK_KP2                    = SDLK_KP_2,
    SDLK_KP3                    = SDLK_KP_3,
    SDLK_KP4                    = SDLK_KP_4,
    SDLK_KP5                    = SDLK_KP_5,
    SDLK_KP6                    = SDLK_KP_6,
    SDLK_KP7                    = SDLK_KP_7,
    SDLK_KP8                    = SDLK_KP_8,
    SDLK_KP9                    = SDLK_KP_9,
    SDLK_KP_PERIOD              = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERIOD),
    SDLK_KP_DIVIDE              = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DIVIDE),
    SDLK_KP_MULTIPLY            = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MULTIPLY),
    SDLK_KP_MINUS               = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MINUS),
    SDLK_KP_PLUS                = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUS),
    SDLK_KP_ENTER               = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_ENTER),
    SDLK_KP_EQUALS              = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALS),
    SDLK_NUMLOCKCLEAR           = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_NUMLOCKCLEAR),

    SDLK_UP                     = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UP),
    SDLK_DOWN                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DOWN),
    SDLK_RIGHT                  = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RIGHT),
    SDLK_LEFT                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LEFT),
    SDLK_INSERT                 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_INSERT),
    SDLK_HOME                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HOME),
    SDLK_END                    = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_END),
    SDLK_PAGEUP                 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEUP),
    SDLK_PAGEDOWN               = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEDOWN),
    SDLK_DELETE                 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DELETE),
    SDLK_PAUSE                  = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAUSE),
    SDLK_PRINTSCREEN            = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRINTSCREEN),
    SDLK_SCROLLLOCK             = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SCROLLLOCK),
    SDLK_CAPSLOCK               = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CAPSLOCK),
    SDLK_POWER                  = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_POWER),

    SDLK_F1                     = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F1),
    SDLK_F2                     = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F2),
    SDLK_F3                     = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F3),
    SDLK_F4                     = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F4),
    SDLK_F5                     = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F5),
    SDLK_F6                     = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F6),
    SDLK_F7                     = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F7),
    SDLK_F8                     = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F8),
    SDLK_F9                     = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F9),
    SDLK_F10                    = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F10),
    SDLK_F11                    = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F11),
    SDLK_F12                    = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F12),
    SDLK_F13                    = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F13),
    SDLK_F14                    = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F14),
    SDLK_F15                    = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F15),
    SDLK_F16                    = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F16),
    SDLK_F17                    = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F17),
    SDLK_F18                    = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F18),
    SDLK_F19                    = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F19),
    SDLK_F20                    = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F20),
    SDLK_F21                    = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F21),
    SDLK_F22                    = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F22),
    SDLK_F23                    = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F23),
    SDLK_F24                    = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F24),

    SDLK_EXECUTE                = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXECUTE),
    SDLK_HELP                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HELP),
    SDLK_MENU                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MENU),
    SDLK_SELECT                 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SELECT),
    SDLK_STOP                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_STOP),
    SDLK_AGAIN                  = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AGAIN),
    SDLK_UNDO                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UNDO),
    SDLK_CUT                    = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CUT),
    SDLK_COPY                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_COPY),
    SDLK_PASTE                  = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PASTE),
    SDLK_FIND                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_FIND),
    SDLK_MUTE                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MUTE),
    SDLK_VOLUMEUP               = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEUP),
    SDLK_VOLUMEDOWN             = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEDOWN),
    SDLK_KP_COMMA               = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COMMA),
    SDLK_APPLICATION            = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_APPLICATION),

    SDLK_LCTRL                  = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LCTRL),
    SDLK_LSHIFT                 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LSHIFT),
    SDLK_LALT                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LALT),
    SDLK_LGUI                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LGUI),
    SDLK_RCTRL                  = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RCTRL),
    SDLK_RSHIFT                 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RSHIFT),
    SDLK_RALT                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RALT),
    SDLK_RGUI                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RGUI),
    SDLK_MODE                   = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MODE),
};

typedef enum SDL_Keymod {
    KMOD_NONE                   = 0,
    KMOD_LSHIFT                 = 1 << 0,
    KMOD_RSHIFT                 = 1 << 1,
    KMOD_LCTRL                  = 1 << 2,
    KMOD_RCTRL                  = 1 << 3,
    KMOD_LALT                   = 1 << 4,
    KMOD_RALT                   = 1 << 5,
    KMOD_LGUI                   = 1 << 6,
    KMOD_RGUI                   = 1 << 7,
    KMOD_LMETA                  = 1 << 8,
    KMOD_RMETA                  = 1 << 9,
    KMOD_NUM                    = 1 << 12,
    KMOD_CAPS                   = 1 << 13,
    KMOD_MODE                   = 1 << 14,

    KMOD_CTRL                   = (KMOD_LCTRL | KMOD_RCTRL),
    KMOD_SHIFT                  = (KMOD_LSHIFT | KMOD_RSHIFT),
    KMOD_ALT                    = (KMOD_LALT | KMOD_RALT),
    KMOD_GUI                    = (KMOD_LGUI | KMOD_RGUI),
    KMOD_META                   = (KMOD_LMETA | KMOD_RMETA),

    KMOD_RESERVED               = 0x8000,
} SDL_Keymod;

#ifdef __cplusplus
}
#endif

#endif      // __VSF_SDL2_KEYCODE_H__
